package algorithm_demo.leetcode;

/**
 * 8. 字符串转换整数 (atoi)
 * https://leetcode.cn/problems/string-to-integer-atoi/
 * @author Api
 * @date 2023/4/24 0:21
 */
public class Problem_008_StringToInteger {
    public static int myAtoi(String s) {
        int length = s.length();
        char[] charList = s.toCharArray();
        //定符号
        int sign = 1;
        int index = 0;
        int result = 0;
        //去空格
        while(index < length){
            if (charList[index] != ' '){
                break;
            }
            index++;
        }
        if (index == length){
            return 0;
        }
        //判别符号
        if (charList[index] == '+'){
            index++;
        }else if (charList[index] == '-'){
            index++;
            sign = -1;
        }
        //开始处理数据
        while(index < length){
            //遍历到不是数字 退出，校验是否为数字
            if (charList[index] > '9' || charList[index] < '0'){
                break;
            }
            //判断是否超过范围
            //判断当前结果的范围（因为当前结果继续运算的话要乘以10，所以当前结果一定要小于max/10）和当前结果加上下一个数字的范围
            //判断当前result值的大小，因为下面*10,所以result>Integer.MAX_VALUE时，肯定是大于它的
            //如果result和Integer.MAX_VALUE是相等的，一定需要校验它的最后一位数字是否大于
            if(result > Integer.MAX_VALUE / 10 ||((result == Integer.MAX_VALUE / 10) && (charList[index] - '0') > Integer.MAX_VALUE % 10)){
                //超过最大值范围返回最大值
                return Integer.MAX_VALUE;
            }
            //判断当前结果的范围和当前结果加上下一个数字的范围
            //最小值是负数 判断加上下一个值是否超过范围时转换成正数来考虑
            if(result < Integer.MIN_VALUE / 10 || ((result == Integer.MIN_VALUE / 10) && ((charList[index] - '0') > -(Integer.MIN_VALUE % 10)))){
                return Integer.MIN_VALUE;
            }
            int a = charList[index] - '0';
            result = result * 10 + sign * a;
            index++;
        }
        return result;
    }

    public static void main(String[] args) {
        myAtoi("4193 with words");
    }
}
